Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor: Ctrl+C Termination in CLI #8739

Merged
merged 1 commit into from
Jan 4, 2024
Merged

Minor: Ctrl+C Termination in CLI #8739

merged 1 commit into from
Jan 4, 2024

Conversation

berkaysynnada
Copy link
Contributor

Which issue does this PR close?

Closes #.

Rationale for this change

For streams and long running queries, we will be able to abort the execution and return back to the readline() state without terminating the CLI session with ctrl+c signal.

What changes are included in this PR?

Are these changes tested?

Are there any user-facing changes?

@berkaysynnada berkaysynnada changed the title Ctrl+C Termination in CLI Minor: Ctrl+C Termination in CLI Jan 3, 2024
Copy link
Contributor

@comphead comphead left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @berkaysynnada
What will happen with already running queries/streams if Ctrl+C get pressed?

Copy link
Contributor

@ozankabak ozankabak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Ok(_) => {}
Err(err) => eprintln!("{err}"),
tokio::select! {
res = exec_and_print(ctx, print_options, line) => match res {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like CTRL+C just getting out of the loop without actual query interruption?

So the machine resources is not released when the user tries to run next query after CTRL+C?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding was that when control arrives there, tasks were already interrupted. But I could be wrong -- in that case this PR needs to address your point

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this code is correct.

My understanding of what happens is that if the signal is handled, it will drop the future running exec_and_print which will implicitly is droped which should then propagate back and cancel outstanding tasks

There are a variety of tests that validate that outstanding tasks are cancelled when their containing streams are dropped such as https://github.com/apache/arrow-datafusion/blob/1179a76567892b259c88f08243ee01f05c4c3d5c/datafusion/physical-plan/src/coalesce_partitions.rs#L216-L234

If we find instances where dropping a stream doesn't cancel the ongoing execution, I think we should file that as a bug and fix it

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 it might be good to add some documentation to the https://docs.rs/datafusion/latest/datafusion/physical_plan/trait.ExecutionPlan.html#tymethod.execute to explain the drop / cancel behavior and expectations this better. I will add that to my list

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is correct, too

Per tokio::select documentation:

Waits on multiple concurrent branches, returning when the first branch completes, cancelling the remaining branches.

This is also what I tried initially: #1279 (comment)

But I had the roadblock of exec_and_print being blocking at that time. That doesn't seem to be the case anymore so this should be good.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is a proposed PR with some clarifying documentation : #8747

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I had the roadblock of exec_and_print being blocking at that time. That doesn't seem to be the case anymore so this should be good.

I think @berkaysynnada / @ozankabak made the output mostly streaming in #8651

Copy link
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @berkaysynnada

Ok(_) => {}
Err(err) => eprintln!("{err}"),
tokio::select! {
res = exec_and_print(ctx, print_options, line) => match res {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this code is correct.

My understanding of what happens is that if the signal is handled, it will drop the future running exec_and_print which will implicitly is droped which should then propagate back and cancel outstanding tasks

There are a variety of tests that validate that outstanding tasks are cancelled when their containing streams are dropped such as https://github.com/apache/arrow-datafusion/blob/1179a76567892b259c88f08243ee01f05c4c3d5c/datafusion/physical-plan/src/coalesce_partitions.rs#L216-L234

If we find instances where dropping a stream doesn't cancel the ongoing execution, I think we should file that as a bug and fix it

Ok(_) => {}
Err(err) => eprintln!("{err}"),
tokio::select! {
res = exec_and_print(ctx, print_options, line) => match res {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 it might be good to add some documentation to the https://docs.rs/datafusion/latest/datafusion/physical_plan/trait.ExecutionPlan.html#tymethod.execute to explain the drop / cancel behavior and expectations this better. I will add that to my list

@Jefffrey
Copy link
Contributor

Jefffrey commented Jan 3, 2024

Relates to this issue I believe?

#1279

@ozankabak
Copy link
Contributor

Thanks for the reviews everyone!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants